﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using CROSLAND.BL.BE;
using System.Collections.Generic;
using CROSLAND.BL.BC;
using DevExpress.Web.ASPxTreeList;
using System.Reflection;
using DevExpress.Web.ASPxClasses;

namespace CROSLAND.WebApp
{
    public partial class Seguimiento : System.Web.UI.Page
    {
        protected void Page_Init(object sender, EventArgs e)
        {
            this.validaLogin();
        }

        private void validaLogin()
        {
            if (Session["UsuarioWeb"] == null || Session["UsuarioSAP"] == null)
            {
                Response.Redirect("Login.aspx");
                //en vez de redireccionar, debería cerrar la pantalla
            }
        }

        public string cadena_padre;
        public string cadena_hija;
        public string cadena_nieta;

        protected void btnVer_Click(object sender, EventArgs e)
        {
            if (TreeList.SelectionCount == 1)
            {
                TreeListNode tln = TreeList.FocusedNode;
                if (tln != null)
                {
                    DataRowView drv = (DataRowView)tln.DataItem;
                    string doc = drv.Row[4].ToString();
                    string pvbtyp_n = drv.Row["codTipoDoc"].ToString();

                    List<EntregaBE> lstEntrega = PedidoBC.Instance.verEntrega(doc, pvbtyp_n);

                
                    if (lstEntrega.Count > 0)
                    {
                        cgvEntrega.DataSource = lstEntrega;
                        cgvEntrega.DataBind();

                        if (pvbtyp_n == "B" || pvbtyp_n == "C" || pvbtyp_n == "K" || pvbtyp_n == "H")
                        {
                            //Documento de ventas: Datos de posición
                            cgvEntrega.Columns[10].Visible = false;
                            cgvEntrega.Columns[9].Visible = false;
                            cgvEntrega.HeaderRow.Cells[0].Text = "Pedido";
                            lblTituloEntrega.Text = "Detalle de Pedido";
                            cgvEntrega.HeaderRow.Cells[4].Text = "Cant.";

                        }
                        else if (pvbtyp_n == "M" || pvbtyp_n == "N" || pvbtyp_n == "O" || pvbtyp_n == "S")
                        {
                            //Factura: Datos de posición
                            cgvEntrega.Columns[10].Visible = false;
                            cgvEntrega.Columns[9].Visible = false;
                            cgvEntrega.HeaderRow.Cells[0].Text = "Factura";
                            lblTituloEntrega.Text = "Detalle de Factura";
                            cgvEntrega.HeaderRow.Cells[4].Text = "Ctd.";
                            
                        }
                        else {

                            cgvEntrega.Columns[10].Visible = true;
                            cgvEntrega.Columns[9].Visible = true;
                            cgvEntrega.HeaderRow.Cells[0].Text = "Entrega";
                            cgvEntrega.HeaderRow.Cells[4].Text = "Ctd. Ent.";
                            lblTituloEntrega.Text = "Detalle de Entrega";
                        }
                        mpeEntrega.Show();
                    }
                }
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                //if (!IsPostBack)
                //{
                    ASPxWebControl.RegisterBaseScript(this);

                    string numeroPedido = "";
                    if (Request.QueryString["np"] != null)
                    {
                        numeroPedido = Request.QueryString["np"].ToString();
                    }

                    if (!numeroPedido.Equals(""))
                    {
                        List<SeguimientoBE> lstSeguimiento = PedidoBC.Instance.buscaDocumentos(numeroPedido);
                        StatusBE objStatus = PedidoBC.Instance.verStatus(numeroPedido);

                        if (lstSeguimiento.Count > 0 || objStatus != null)
                        {
                            DataTable dt = Converter<SeguimientoBE>.Convert(lstSeguimiento);

                            dt.Columns.Add("Hijos", typeof(string));
                            string cod;

                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                cadena_padre = "";
                                cod = Convert.ToString(dt.Rows[i]["Jerarquia"]);
                                int longitud = cod.Length - 2;
                                for (int j = 0; j < longitud; j++)
                                {
                                    cadena_padre = cadena_padre + cod[j];
                                }
                                dt.Rows[i]["Hijos"] = cadena_padre;
                            }
                            TreeList.DataSource = dt;
                            TreeList.DataBind();
                            TreeList.ExpandAll();
                            TreeListNode nodo = TreeList.FindNodeByFieldValue("DocSeleccionado", true);
                            if (nodo != null)
                            {
                                nodo.Selected = true;
                                //nodo.AllowSelect = false;
                            }
                            //----
                            lbl_bloqueo.Text = objStatus.Bloqueo;
                            lbl_credito.Text = objStatus.Credito;
                            lbl_entrega.Text = objStatus.Entrega;
                            lbl_global.Text = objStatus.Global;
                            lbl_rechazo.Text = objStatus.Rechazo;
                        }
                        else
                        {
                            throw new Exception("No se encontró información para el doc. de ventas especificado.");
                        }
                    }
                    else
                    {
                        throw new Exception("No se especificó el doc. de ventas.");
                    }
                //}
                //else
                //{
                //    throw new Exception("Operación Inválida.");
                //}
            }
            catch (Exception ex)
            {
                Response.Write("<h4>No se puede mostrar la información del documento seleccionado.<br /></h4>");//Error: " + ex.Message + "</h4>");
                Page.Visible = false;
            }
        }
    }

    public static class Converter<T> where T : new()
    {
        public static DataTable Convert(List<T> items)
        {
            DataTable returnValue = new DataTable();
            Type itemsType = typeof(T);
            // Recorremos las propiedades para crear las columnas del datatable
            foreach (PropertyInfo prop in itemsType.GetProperties())
            {
                // Crearmos y agregamos una columna por cada propiedad de la entidad
                DataColumn column = new DataColumn(prop.Name);
                column.DataType = prop.PropertyType;
                returnValue.Columns.Add(column);
            }
            int j;
            // ahora recorremos la colección para guardar los datos
            // en el DataTable
            foreach (T item in items)
            {
                j = 0;
                object[] newRow = new object[returnValue.Columns.Count];
                // Volvemos a recorrer las propiedades de cada item para
                // obtener su valor guardarlo en la fila de la tabla
                foreach (PropertyInfo prop in itemsType.GetProperties())
                {
                    newRow[j] = prop.GetValue(item, null);
                    j++;
                }
                returnValue.Rows.Add(newRow);
            }
            // Devolver el objeto creado
            return returnValue;
        }
    }
}
